
from constantes import *
from interfaz import Interfaz
import paises as paises


class Pais(object):
	"""Clase que representa cada pais del juego."""

	def __init__(self, limitrofes, continente = "", color = "", ejercitos = 0):
		"""Crea un pais con las distintas caraceristicas que este posee en el juego."""
		self.continente = continente
		self.limitrofes = limitrofes
		self.color = color
		self.ejercitos = ejercitos


class Tablero(object):
	"""Clase que representa el tablero de juego."""

	def __init__(self, continentes, limitrofes):
		"""Crea un tablero desde un diccionario de continentes con su
		lista de paises, y un diccionario de paises y su lista de
		limitrofes."""
		self.tablero = {}

		for pais in limitrofes:
			self.tablero[pais] = Pais(limitrofes[pais])
			self.tablero[pais].continente = self._obtener_continente_pais(pais, continentes)

	def _obtener_continente_pais(self, pais, continentes):
		"""Recibe por parametro un pais, que es una cadena, y continentes, que es un diccionario
		con continentes como claves y los paises que contiene como valores.
		   Devuelve el continente, que es una cadena, en el que se encuentra el pais."""
		for continente in continentes:
			if pais in continentes[continente]:
				return continente

	def ocupar_pais(self, pais, color, ejercitos=1):
		"""Ocupa el pais indicado con ejercitos del color."""
		self.tablero[pais].color = color
		self.tablero[pais].ejercitos += ejercitos

	def asignar_ejercitos(self, pais, ejercitos):
		"""Suma o resta una cantidad de ejercitos en el pais indicado."""
		self.tablero[pais].ejercitos += ejercitos

	def actualizar_interfaz(self, agregados=None):
		"""Redibuja interfaz grafica. Puede recibir un diccionario de
		paises y numero de ejercitos que se adicionan o sustraen a los
		que estan ubicados en el tablero.
		Por ejemplo, si el diccionario fuera
		{'Argentina': -1, 'Brasil': 1}, el tablero se dibujaria con un
		ejercito menos en Argentina y uno mas en Brasil."""
		paises_actualizar = {}
		for pais in self.tablero:
			if (agregados != None) and (pais in agregados):
				paises_actualizar[pais] = (self.tablero[pais].color, self.tablero[pais].ejercitos\
					+ agregados[pais])
			else:
				paises_actualizar[pais] = (self.tablero[pais].color, self.tablero[pais].ejercitos)

		Interfaz.ubicar_ejercitos(paises_actualizar)

	def color_pais(self, pais):
		"""Devuelve el color de un pais."""
		return self.tablero[pais].color

	def ejercitos_pais(self, pais):
		"""Devuelve la cantidad ejercitos en un pais."""
		return self.tablero[pais].ejercitos

	def es_limitrofe(self, pais1, pais2):
		"""Informa si dos paises son limitrofes."""
		for pais in paises.paises_limitrofes:
			if pais == pais1:
				return pais2 in paises.paises_limitrofes[pais]

	def cantidad_paises(self):
		"""Informa la cantidad de paises totales."""
		return len(self.tablero)

	def cantidad_paises_continente(self, continente):
		"""Informa la cantidad de paises en continente."""
		return len(paises.paises_por_continente[continente])

	def continente_pais(self, pais):
		"""Informa el continente de un pais."""
		return self.tablero[pais].continente

	def paises_color(self, color):
		"""Devuelve la lista de paises con ejercitos del color."""
		paises_del_color = []
		for pais in self.tablero:
			if (self.tablero[pais].color == color) and (self.tablero[pais].ejercitos > 0):
				paises_del_color.append(pais)
		return paises_del_color